SETPGID(2) | Linux Programmer's Manual | SETPGID(2) |
名前¶
setpgid, getpgid, setpgrp, getpgrp - プロセス・グループの設定/取得を行う
書式¶
#include <unistd.h>
int setpgid(pid_t pid, pid_t
pgid);
pid_t getpgid(pid_t pid);
pid_t getpgrp(void); /* POSIX.1 version */
pid_t getpgrp(psid_t
pid);
/* BSD version */
int setpgrp(void); /* System V version */
int setpgrp(pid_t pid, pid_t pgid); /* BSD
version */
glibc
向けの機能検査マクロの要件
(feature_test_macros(7) 参照):
getpgid(): _XOPEN_SOURCE >= 500
setpgrp() (POSIX.1): _SVID_SOURCE || _XOPEN_SOURCE >= 500
setpgrp() (BSD), getpgrp() (BSD): _BSD_SOURCE && ! (_POSIX_SOURCE || _POSIX_C_SOURCE || _XOPEN_SOURCE || _XOPEN_SOURCE_EXTENDED || _GNU_SOURCE || _SVID_SOURCE)
説明¶
これらのインタフェースすべてが Linux で利用可能で、 これらを使ってプロセスのプロセス・グループ ID (PGID) の 取得や設定ができる。 推奨の、POSIX.1 で規定された方法では、 getpgrp(void) で呼び出し元プロセスの PGID を取得し、 setpgid() で設定する。
setpgid() は pid で指定したプロセスの PGID に pgid を設定する。 pid がゼロならば、呼び出し元プロセスのプロセス ID が pid として使用される。 pgid がゼロならば、 pid で指定されたプロセスの PGID がそのプロセスのプロセス ID と 同じに設定される。 setpgid() をプロセスをあるプロセス・グループから別のグループへ 移動するために使用する場合は (一部のシェルはパイプラインを生成 する時にこれを行う)、両方のプロセス・グループは同じセッションの 一部でなければならない (setsid(2) と credentials(7) 参照)。この場合は pgid は参加すべき既存の プロセス・グループを指定し、そのセッション ID は参加するプロセスの セッション ID に一致しなければならない。
POSIX.1 バージョンの getpgrp() は引き数を一つもとらず、 呼び出し元プロセスの PGID を返す。
getpgid() は pid で指定されたプロセスの PGID を返す。 pid がゼロならば、呼び出し元プロセスのプロセス ID が pid として使用される。 (呼び出し元プロセス以外のプロセスの PGID の取得が必要になることは めったになく、呼び出し元プロセスの PGID を取得するには POSIX.1 バージョンの getpgrp() を使うのが望ましい。)
System V バージョンの setpgrp() は引き数を一つもとらず、 setpgid(0, 0) と等価である。
BSD 仕様の setpgrp() は pid と pgid を引き数にとり、 setpgid(pid, pgid) と等価である。
BSD 仕様の getpgrp() は pid だけを引き数にとり、 getpgid(pid) と等価である。
返り値¶
setpgid() と setpgrp() は成功した場合、ゼロを返す。エラーの場合は -1 を返し、 errno が適切に設定される。
POSIX.1 バージョンの getpgrp() は常に呼び出しプロセスの PGID を返す。
getpgid() と BSD 仕様の getpgrp() は成功した場合プロセス・グループを返す。 エラーの場合は -1 を返し、 errno が適切に設定される。
エラー¶
- EACCES
- 呼び出し元プロセスの子プロセスのプロセス・グループ ID を変更しようとしたが、 すでにその子プロセスは execve(2) を実行していた。 (setpgid(), setpgrp())
- EINVAL
- pgid が 0 より小さい。 (setpgid(), setpgrp())
- EPERM
- プロセスを異なるセッションのプロセス・グループに移動させようとした。 または呼び出し元プロセスの子プロセスのプロセス・グループ ID を変更しようと したが、その子プロセスは別のセッションだった。 またはセッションリーダーのプロセス・グループ ID を変更しようとした。 (setpgid(), setpgrp())
- ESRCH
- getpgid() の場合: pid がどのプロセスにも一致しない。 setpgid() の場合: pid が呼び出し元のプロセスではなく、呼び出し元のプロセスの子プロセスでもない。
準拠¶
setpgid() と、引き数なしバージョンの getpgrp() は POSIX.1-2001 に準拠している。
POSIX.1-2001 は、 getpgid() と、引き数なしバージョンの setpgrp() も規定している。 POSIX.1-2008 は、この setpgrp() の仕様を廃止予定としている。
引き数 1 個バージョンの getpgrp() と引き数 2 個バージョンの setpgrp() は 4.2BSD に由来し、 POSIX.1 では規定されていない。
注意¶
fork(2) で作成された子プロセスは、親プロセスの PGID を継承する。 execve(2) の前後で PGID は保存される。
各プロセス・グループはセッションのメンバーであり、各プロセスは そのプロセス・グループが所属しているセッションのメンバーである。
セッションは制御端末 (controlling terminal) を持つことができる。 いつでも、セッションに所属するプロセス・グループの一つ (だけ) が 端末のフォアグランドのプロセス・グループになることができ、 残りのプロセス・グループはバックグラウンドになる。 端末からシグナルが生成された場合 (例えば、中断キーを叩いて SIGINT が生成されるなど)、そのシグナルはフォアグラウンドのプロセス・グループ に送られる (シグナルを生成する文字の説明は termios(3) を参照)。 フォアグラウンドのプロセス・グループだけが端末からの read(2) ができる。 バックグラウンドのプロセス・グループが端末からの read(2) を行おうとした場合、そのプロセス・グループにはシグナル SIGTSTP が送られ、そのプロセス・グループは一時停止 (suspend) する。 関数 tcgetpgrp(3) と tcsetpgrp(3) を使うと、制御端末のフォアグラウンドのプロセス・グループを 取得/設定できる。
setpgid() と getpgrp() は、 bash(1) のようなプログラムで、シェルのジョブ制御 (job control) の実装のための プロセスグループを作成するのに使われる。
セッションが制御端末を持っていて、その端末に対して CLOCAL フラグが設定されておらず、端末のハングアップが起きた場合、 セッション・リーダーに SIGHUP が送られる。 セッション・リーダーが終了した場合には、その制御端末の フォアグランドのプロセス・グループに所属する各プロセスにも SIGHUP シグナルが送られる。
プロセスの終了によってプロセス・グループが孤児 (orphaned) になった際に、 その新たに孤児になったプロセス・グループに停止しているメンバーがいれば、 その孤児になったプロセス・グループの全てのプロセスに SIGHUP シグナルに続けて SIGCONT シグナルが送られる。
関連項目¶
getuid(2), setsid(2), tcgetpgrp(3), tcsetpgrp(3), termios(3), credentials(7)
2008-08-06 | Linux |